package com.szjz.excel.importexport;

import com.szjz.excel.importexport.util.StyleUtil;
import org.apache.poi.ss.usermodel.*;

/**
 * 样式集合，此样式集合汇集了整个工作簿的样式，用于减少样式的创建和冗余
 */
public class StyleSet {

    /**
     * 工作簿引用
     */
    private Workbook workbook;
    /**
     * 标题样式
     */
    protected CellStyle headCellStyle;
    /**
     * 默认样式, 其他自定义样式从该样式clone
     */
    protected CellStyle cellStyle;
    /**
     * 默认整型数字样式
     */
    protected CellStyle cellStyleForInteger;
    /**
     * 默认浮点数字样式
     */
    protected CellStyle cellStyleForFloat;

    /**
     * 构造
     *
     * @param workbook 工作簿
     */
    public StyleSet(Workbook workbook) {
        this.workbook = workbook;
        this.headCellStyle = StyleUtil.createHeadCellStyle(workbook);
        this.cellStyle = StyleUtil.createDefaultCellStyle(workbook);

        // 整型数字样式
        cellStyleForInteger = StyleUtil.cloneCellStyle(workbook, this.cellStyle);
        // 0表示：没有小数
        cellStyleForInteger.setDataFormat((short) 0);

        // 浮点型数字样式
        cellStyleForFloat = StyleUtil.cloneCellStyle(workbook, this.cellStyle);
        // 2表示：0.00
        cellStyleForFloat.setDataFormat((short) 2);
    }

    /**
     * 获取头部样式，获取后可以定义整体头部样式
     *
     * @return 头部样式
     */
    public CellStyle getHeadCellStyle() {
        return headCellStyle;
    }

    /**
     * 获取常规单元格样式，获取后可以定义整体头部样式
     *
     * @return 常规单元格样式
     */
    public CellStyle getCellStyle() {
        return cellStyle;
    }

    /**
     * 获取整型数字单元格样式，获取后可以定义整体头部样式
     *
     * @return 整型数字单元格样式
     */
    public CellStyle getCellStyleForInteger() {
        return cellStyleForInteger;
    }

    /**
     * 获取浮点数字单元格样式，获取后可以定义整体头部样式
     *
     * @return 浮点数字单元格样式
     */
    public CellStyle getCellStyleForFloat() {
        return cellStyleForFloat;
    }

    /**
     * 定义所有单元格的边框类型
     *
     * @param borderSize 边框粗细{@link BorderStyle}枚举
     * @param colorIndex 颜色的short值
     * @return this
     * @since 4.0.0
     */
    public StyleSet setBorder(BorderStyle borderSize, IndexedColors colorIndex) {
        StyleUtil.setBorder(this.headCellStyle, borderSize, colorIndex);
        StyleUtil.setBorder(this.cellStyle, borderSize, colorIndex);
        StyleUtil.setBorder(this.cellStyleForInteger, borderSize, colorIndex);
        StyleUtil.setBorder(this.cellStyleForFloat, borderSize, colorIndex);
        return this;
    }

    /**
     * 设置cell文本对齐样式
     *
     * @param halign 横向位置
     * @param valign 纵向位置
     * @return this
     * @since 4.0.0
     */
    public StyleSet setAlign(HorizontalAlignment halign, VerticalAlignment valign) {
        StyleUtil.setAlign(this.headCellStyle, halign, valign);
        StyleUtil.setAlign(this.cellStyle, halign, valign);
        StyleUtil.setAlign(this.cellStyleForInteger, halign, valign);
        StyleUtil.setAlign(this.cellStyleForFloat, halign, valign);
        return this;
    }

    /**
     * 设置单元格背景样式
     *
     * @param backgroundColor 背景色
     * @param withHeadCell    是否也定义头部样式
     * @return this
     * @since 4.0.0
     */
    public StyleSet setBackgroundColor(IndexedColors backgroundColor, boolean withHeadCell) {
        if (withHeadCell) {
            StyleUtil.setColor(this.headCellStyle, backgroundColor, FillPatternType.SOLID_FOREGROUND);
        }
        StyleUtil.setColor(this.cellStyle, backgroundColor, FillPatternType.SOLID_FOREGROUND);
        StyleUtil.setColor(this.cellStyleForInteger, backgroundColor, FillPatternType.SOLID_FOREGROUND);
        StyleUtil.setColor(this.cellStyleForFloat, backgroundColor, FillPatternType.SOLID_FOREGROUND);
        return this;
    }

    /**
     * 设置全局字体
     *
     * @param color    字体颜色
     * @param fontSize 字体大小，-1表示默认大小
     * @param fontName 字体名，null表示默认字体
     * @return this
     */
    public StyleSet setFont(short color, short fontSize, String fontName) {
        final Font font = StyleUtil.createFont(this.workbook, color, fontSize, fontName);
        this.headCellStyle.setFont(font);
        this.cellStyle.setFont(font);
        this.cellStyleForInteger.setFont(font);
        this.cellStyleForFloat.setFont(font);
        return this;
    }
}
